﻿using System;
using System.Collections;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Security.Services;
using Sinacor.UI.Bovespa.Clientes.Communication.Bovespa.Cliente.DicionarioErroExportacaoComitente;

namespace Sinacor.UI.Bovespa.Clientes.Communication
{
    /// <summary>
    /// 
    /// </summary>
    public class DicionarioErroExportacaoComitente : BaseCommunication
    {
        #region Construtor

        /// <summary>
        /// Construtor da classe DicionarioErroExportacaoComitente
        /// </summary>
        /// <param name="session"></param>
        public DicionarioErroExportacaoComitente(SessionInformation session) : base(session) { }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// Método usado para Consultar Erros Exportação Comitente
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ModelCollection<Model.ErroExportacaoComitente> ConsultarErrosExportacoesComitentes(Model.Parameter.FiltroErroExportacaoComitente request)
        {
            ModelCollection<Model.ErroExportacaoComitente> response = null;

            try
            {
                using (ServiceInstance<IDicionarioErroExportacaoComitente> serviceManager = new ServiceInstance<IDicionarioErroExportacaoComitente>())
                {
                    Translator.ModelToDataContract.DicionarioErroExportacaoComitente modelToContract = new Translator.ModelToDataContract.DicionarioErroExportacaoComitente();
                    FiltroErroExportacaoComitenteRequest req = modelToContract.ToFiltroErroExportacaoComitenteRequest(request);

                    IDicionarioErroExportacaoComitente servico = serviceManager.TryGetInstance(this.Session);
                    List<ErroExportacaoComitenteResponse> responseErroExportacaoComitente = servico.ConsultarErrosExportacoesComitentes(req);

                    // traduzir para contrato para model
                    Translator.DataContractToModel.DicionarioErroExportacaoComitente contractToModel = new Translator.DataContractToModel.DicionarioErroExportacaoComitente();
                    response = contractToModel.ToErroExportacaoComitente(responseErroExportacaoComitente);
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }

            return response;
        }

        /// <summary>
        /// Método usado para Executar Transações de Inclusão, Alteração e Exclusão
        /// </summary>
        /// <param name="listaInclusao"></param>
        /// <param name="listaExclusao"></param>
        /// <param name="listaAlteracao"></param>
        public void ExecutarTransacoes(ModelCollection<Model.ErroExportacaoComitente> listaInclusoes, ModelCollection<Model.Parameter.FiltroErroExportacaoComitenteChave> listaExclusoes, ModelCollection<Model.ErroExportacaoComitente> listaAlteracoes)
        {
            try
            {
                using (ServiceInstance<IDicionarioErroExportacaoComitente> serviceManager = new ServiceInstance<IDicionarioErroExportacaoComitente>())
                {
                    Translator.ModelToDataContract.DicionarioErroExportacaoComitente modelToContract = new Translator.ModelToDataContract.DicionarioErroExportacaoComitente();
                    List<ErroExportacaoComitenteRequest> reqListaInclusoes = modelToContract.ToErroExportacaoComitenteRequest(listaInclusoes);
                    List<FiltroErroExportacaoComitenteChaveRequest> reqListaExclusoes = modelToContract.ToFiltroErroExportacaoComitenteChaveRequest(listaExclusoes);
                    List<ErroExportacaoComitenteRequest> reqListaAlteracoes = modelToContract.ToErroExportacaoComitenteRequest(listaAlteracoes);

                    IDicionarioErroExportacaoComitente servico = serviceManager.TryGetInstance(this.Session);
                    servico.ExecutarTransacoes(reqListaExclusoes, reqListaInclusoes, reqListaAlteracoes);
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }
        }
        #endregion
    }
}
